/*******************************************************************************
** File Name:    softtimer.h
** note:         softtimer
** Author:       lijw
** Version:      1.0
** Created Data: 2023-04-02
** islijw@163.com
**
** Copyright (c) 2023 lijw
** All rights reserved.
*******************************************************************************/
#ifndef __SOFT_TIMER_H__
#define __SOFT_TIMER_H__
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
/* 临界区 */
#define SOFT_TIMER_ENTER_CRITICAL()
#define SOFT_TIMER_EXIT_CRITICAL()

/* ticks定义 */
typedef uint32_t soft_timer_ticks_t;
/* 函数返回 */
typedef enum _soft_timer_status_t
{
    soft_timer_error = 0,
    soft_timer_ok = 1,
}soft_timer_status_t;

/* 定时器链表 */
typedef struct _soft_timer_list_item_t
{
    struct _soft_timer_list_item_t *  next;
    struct _soft_timer_list_item_t *  prev;
}soft_timer_list_item_t;


/* 定时器回调函数定义 */
typedef void soft_timer_cb_t(void*);

/* 定时器结构 */
typedef struct _soft_timer_t
{
    int times;                            /* 重载次数，-1为永久 */
    soft_timer_ticks_t      interval;     /* 计时周期，单位ticks */
    soft_timer_ticks_t      last_ticks;   /* 上一次计数溢出值 */
    soft_timer_list_item_t item;          /* 定时器链表节点 */
    soft_timer_cb_t        *cb;           /* 溢出回调函数 */
    void                   *parm;         /* 回调函数参数 */
}soft_timer_t;
/**
  *  @brief 此函数需放入定时器中，作为软件定时器的ticks源
  *  @param none
  *  @note 软件定时器周期ticks由本函数决定
  *  @Sample usage: 
 ***/
void soft_timer_inc_ticks(void);
/*
  *  @brief 添加一个软件定时器，添加之后即开始定时
  *  @param 定时器的指针
  *  @param 执行次数，-1为循环执行
  *  @param 执行间隔
  *  @param 回调函数
  *  @param 参数
  *  @note 
  *  @Sample usage: 
 ***/
soft_timer_status_t soft_timer_add(soft_timer_t *ptimer, int times, soft_timer_ticks_t interval, soft_timer_cb_t *cb, void* parm);
/**
  *  @brief 
  *  @param 
  *  @note 
  *  @Sample usage: 
 ***/
soft_timer_status_t soft_timer_delete(soft_timer_t *ptimer);
/*
  *  @brief 修改一个软件定时器，修改之后重新指定开始时间，如果定时器没有添加，或者已经执行完成，即修改失败
  *  @param 定时器的指针
  *  @param 执行次数，-1为循环执行
  *  @param 执行间隔
  *  @param 回调函数
  *  @param 参数
  *  @note 
  *  @Sample usage: 
 ***/
soft_timer_status_t soft_timer_modify(soft_timer_t *ptimer, int times, soft_timer_ticks_t interval, soft_timer_cb_t *cb, void* parm);
/**
  *  @brief 定时器任务，本函数为循环调用定时器的函数，调用间隔越久，定时器间隔误差越大
  *  @param none
  *  @note 
  *  @Sample usage: 
 ***/
void soft_timer_loop(void);
/**
  *  @brief 软件延时函数，空转cpu
  *  @param 延时delay_ticks个ticks
  *  @note 
  *  @Sample usage: 
 ***/
void soft_timer_delay_ticks(soft_timer_ticks_t delay_ticks);
#endif